package org.dromara.basics.file.core.client.s3;

import cn.hutool.core.util.StrUtil;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.basics.file.core.client.FileClientConfig;
import org.dromara.common.oss.properties.FileProperties;
import org.hibernate.validator.constraints.URL;

/**
 * S3 文件客户端的配置类
 *
 * @author 芋道源码
 */
@Data
@AutoMapper(target = FileProperties.class, reverseConvertGenerate = false)
public class S3FileClientConfig implements FileClientConfig {

    /**
     * 七牛云的域名
     */
    public static final String ENDPOINT_QINIU = "qiniucs.com";
    /**
     * 阿里云的域名
     */
    public static final String ENDPOINT_ALIYUN = "aliyuncs.com";
    /**
     * 腾讯云的域名
     */
    public static final String ENDPOINT_TENCENT = "myqcloud.com";

    /**
     * 节点地址
     * 1. MinIO：例如说，http://127.0.0.1:9000
     * 2. 阿里云：https://help.aliyun.com/document_detail/31837.html
     * 3. 腾讯云：https://cloud.tencent.com/document/product/436/6224
     * 4. 七牛云：https://developer.qiniu.com/kodo/4088/s3-access-domainname
     * 5. 华为云：https://developer.huaweicloud.com/endpoint?OBS
     */
    @NotNull(message = "endpoint 不能为空")
    private String endpoint;
    /**
     * 自定义域名
     * 1. MinIO：通过 Nginx 配置
     * 2. 阿里云：https://help.aliyun.com/document_detail/31836.html
     * 3. 腾讯云：https://cloud.tencent.com/document/product/436/11142
     * 4. 七牛云：https://developer.qiniu.com/kodo/8556/set-the-custom-source-domain-name
     * 5. 华为云：https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html
     */
    @URL(message = "domain 必须是 URL 格式")
    private String domain;
    /**
     * 存储 Bucket
     */
    @NotNull(message = "bucket 不能为空")
    private String bucket;
    /**
     * 访问 Key
     * 1. MinIO：
     * 2. 阿里云：https://ram.console.aliyun.com/manage/ak
     * 3. 腾讯云：https://console.cloud.tencent.com/cam/capi
     * 4. 七牛云：https://portal.qiniu.com/user/key
     * 5. 华为云：https://support.huaweicloud.com/qs-obs/obs_qs_0005.html
     */
    @NotNull(message = "accessKey 不能为空")
    private String accessKey;
    /**
     * 访问 Secret
     */
    @NotNull(message = "accessSecret 不能为空")
    private String accessSecret;

    /**
     * 是否https（Y=是,N=否）
     */
    private String isHttps;

    /**
     * 桶权限类型(0private 1public 2custom)
     */
    private String accessPolicy;

    public boolean isDomainValid() {
        // 如果是七牛，必须带有domain，否则无法上传
        if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) {
            return false;
        }
        return true;
    }

}
